package com.eedi.framework.dept.service;


import com.eedi.framework.common.pojo.PageResult;
import com.eedi.framework.common.util.collection.CollectionUtils;
import com.eedi.framework.dept.controller.org.vo.OrgDeptListReq;
import com.eedi.framework.dept.controller.org.vo.OrgDeptPageReq;
import com.eedi.framework.dept.controller.org.vo.OrgDeptSaveReq;
import com.eedi.framework.dept.controller.org.vo.OrgDeptUpReq;
import com.eedi.framework.dept.dal.dataobject.OrgDeptDO;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 部门 Service 接口
 *
 */
public interface OrgDeptService {

    /**
     * 创建部门
     *
     * @param createReqVO 部门信息
     * @return 部门编号
     */
    String createDept(OrgDeptSaveReq createReqVO);

    /**
     * 更新部门
     *
     * @param updateReqVO 部门信息
     */
    void updateDept(OrgDeptUpReq updateReqVO);

    /**
     * 删除部门
     *
     * @param orgDeptId 部门编号
     */
    void deleteDept(String orgDeptId);
    /**
     * 停用部门
     *
     * @param orgDeptId 部门编号
     */
    void disable(String orgDeptId);
    /**
     * 启用部门
     *
     * @param orgDeptId 部门编号
     */
    void enable(String orgDeptId);
    /**
     * 获得部门信息
     *
     * @param orgDeptId 部门编号
     * @return 部门信息
     */
    OrgDeptDO getDept(String orgDeptId);

    /**
     * 获得部门信息数组
     *
     * @param orgDeptIds 部门id数组
     * @return 部门信息数组
     */
    List<OrgDeptDO> getDeptList(Collection<String> orgDeptIds);

    /**
     * 筛选部门列表
     *
     * @param reqVO 筛选条件请求 VO
     * @return 部门列表
     */
    List<OrgDeptDO> getDeptList(OrgDeptListReq reqVO);

    /**
     * 获得指定编号的部门 Map
     *
     * @param orgDeptIds 部门id数组
     * @return 部门 Map
     */
    default Map<String, OrgDeptDO> getDeptMap(Collection<String> orgDeptIds) {
        List<OrgDeptDO> list = getDeptList(orgDeptIds);
        return CollectionUtils.convertMap(list, OrgDeptDO::getOrgDeptId);
    }

    /**
     * 获得指定部门的所有子部门
     *
     * @param orgDeptId 部门编号
     * @return 子部门列表
     */
    List<OrgDeptDO> getChildDeptList(String orgDeptId);

    /**
     * 获得所有子部门，从缓存中
     *
     * @param orgDeptId 父部门编号
     * @return 子部门列表
     */
    Set<String> getChildDeptIdListFromCache(String orgDeptId);

    /**
     * 校验部门们是否有效。如下情况，视为无效：
     * 1. 部门编号不存在
     * 2. 部门被禁用
     *
     * @param orgDeptIds 角色编号数组
     */
    void validateDeptList(Collection<String> orgDeptIds);

    /**
     * 获取部门数量
     * @return 部门数量
     */
    Long countOrgDept();

    /**
     * 获得部门分页
     *
     * @param reqVO 部门分页查询
     * @return 部门分页结果
     */
    PageResult<OrgDeptDO> getDeptPage(OrgDeptPageReq reqVO);

    /**
     * 根据dept-name获取deptDO
     * @param deptNames
     * @return
     */
    List<OrgDeptDO> listByDeptNames(Collection<String> deptNames);
}
